package com.mazaiting.redeye.utils.net;

import com.fasterxml.jackson.core.type.TypeReference;
import com.mazaiting.redeye.utils.JackJsonUtil;
import org.springframework.http.*;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;

/***
 *
 *
 *                                                    __----~~~~~~~~~~~------___
 *                                   .  .   ~~//====......          __--~ ~~
 *                   -.            \_|//     |||\\  ~~~~~~::::... /~
 *                ___-==_       _-~o~  \/    |||  \\            _/~~-
 *        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *  .~       .~       |   \\ -_    /  /-   /   ||      \   /
 * /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 * |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *          '         ~-|      /|    |-~\~~       __--~~
 *                      |-~~-_/ |    |   ~\_   _-~            /\
 *                           /  \     \__   \/~                \__
 *                       _--~ _/ | .-~~____--~-/                  ~~==.
 *                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                 -_     ~\      ~~---l__i__i__i--~~_/
 *                                 _-~-__   ~)  \--______________--~~
 *                               //.-~~~-~_--~- |-------~~~~~~~~
 *                                      //.-~~~--\
 *                               神兽保佑
 *                              代码无BUG!
 * @author mazaiting
 * @date 2019-06-25
 * @decription Http 工具类
 */
public class HttpUtil {
    /**
     * REST定义了一组体系架构原则，您可以根据这些原则设计以系统资源为中心的Web 服务，包括使用不同语言编写的客户端如何通过 HTTP处理和传输资源状态。
     */
    private static RestTemplate sRestTemplate = new RestTemplate();

    /**
     * GET 请求
     * @param url 网络地址
     * @param responseType 响应参数
     * @return 响应体
     */
    public static <T> T get(String url, Class<T> responseType) throws RestClientException {
        return sRestTemplate.getForObject(url, responseType);
    }

    /**
     * GET 请求
     * @param url 网络地址
     * @param uriVariables 可变参数
     * @return 响应体
     */
    public static String get(String url, Object... uriVariables) {
        // 发送请求
        ResponseEntity<String> response = sRestTemplate.getForEntity(url, String.class, uriVariables);
        // 获取响应体
        return response.getBody();
    }

    /**
     * POST 请求
     * @param url 网络地址
     * @param params 请求参数
     * @return 响应内容
     */
    public static String post(String url, MultiValueMap<String, String> params) {
        HttpHeaders headers = new HttpHeaders();
        //  请勿轻易改变此提交方式，大部分的情况下，提交方式都是表单提交
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        // 创建 HTTP 实体
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
        //  执行HTTP请求
        ResponseEntity<String> response = sRestTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
        // 获取响应体
        return response.getBody();
    }


    /**
     * POST 请求
     * @param url 网络地址
     * @param params 请求参数
     * @return 响应内容
     */
    public static <T> T post(String url, MultiValueMap<String, String> params, TypeReference<T> typeReference) {
        HttpHeaders headers = new HttpHeaders();
        //  请勿轻易改变此提交方式，大部分的情况下，提交方式都是表单提交
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        // 创建 HTTP 实体
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(params, headers);
        //  执行HTTP请求
        String result = sRestTemplate.postForObject(url, requestEntity, String.class);
        // 返回对象
        return JackJsonUtil.formJson(result, typeReference);
    }
}
